코딩테스트 연습 - 두 수의 곱 구하기 | 프로그래머스 스쿨 ss [ 템플릿 코드 ]
#include <string>
#include <vector>
using namespace std;
int solution(int num1, int num2) {
int answer = 0;
return answer;
}[ 풀이 ]
#include <string>
#include <vector>
using namespace std;
int solution(int num1, int num2)
{
return num1 * num2;
}[ 해설 ]
#include <string>
#include <vector>
using namespace std;
int solution(int num1, int num2)
{
return num1 * num2;
}[ 타 답안 ]
#include <iostream> // 입출력을 위한 헤더 포함
using namespace std; // std:: 네임스페이스 생략 설정
// 비트 연산을 이용해 두 수의 곱셈을 수행하는 함수
int kake(int a, int b) {
int res = 0; // 곱셈의 누적 결과값을 저장할 변수를 0으로 초기화합니다.
// 곱할 수 b가 0보다 큰 동안 계속해서 루프를 돕니다.
// (b를 계속 절반씩 줄이다가 0이 되면 곱셈이 완료된 것입니다.)
while (b > 0) {
// [검사] 만약 b의 맨 오른쪽 비트가 1이라면 (즉, b가 현재 홀수라면)
if (b & 1) {
res = res + a; // 현재의 a 값을 결과값(res)에 더해줍니다.
}
// [변환 1] a를 왼쪽으로 1비트 이동시킵니다.
// 이것은 이진수 연산으로 a에 곱하기 2를 한 것과 완전히 똑같습니다. (a = a * 2)
a = a << 1;
// [변환 2] b를 오른쪽으로 1비트 이동시킵니다.
// 이것은 이진수 연산으로 b를 2로 나누고 소수점을 버린 것과 똑같습니다. (b = b / 2)
b = b >> 1;
}
return res; // 최종적으로 누적된 곱셈 결과값을 반환합니다.
}
// 문제를 풀기 위한 최종 솔루션 함수
int solution(int num1, int num2) {
// num1과 num2를 kake 함수로 전달하여 곱한 결과를 그대로 반환합니다.
return kake(num1, num2);
}-
초기 상태:
a = 7,b = 5,res = 0 -
1회전: *
b가 5(홀수)이므로if(b & 1)통과 ➡️res = 0 + 7 = 7-
a는 2배 증가 ➡️a = 14 -
b는 절반으로 감소 ➡️b = 2
-
-
2회전:
-
b가 2(짝수)이므로if(b & 1)건너뜀 ➡️res는 그대로7 -
a는 2배 증가 ➡️a = 28 -
b는 절반으로 감소 ➡️b = 1
-
-
3회전:
-
b가 1(홀수)이므로if(b & 1)통과 ➡️res = 7 + 28 = 35 -
a는 2배 증가 ➡️a = 56 -
b는 절반으로 감소 ➡️b = 0
-
-
종료:
b가 0이 되었으므로while문을 빠져나와 최종res값인35를 반환합니다.